package com.shujia.jichu

import java.util.Scanner
import scala.io.Source

object Demo23Match {
  def main(args: Array[String]): Unit = {
    /**
     * 模式匹配，就可以帮助我们开发的时候，减少代码量，让逻辑看起来更加清晰，以及可以避免一些异常
     * 语法：
     * 表达式 match {
     * case 值|[变量名:类型]|元组|数组|对象=>
     * 匹配成功执行的语句
     * case xxx=>
     * xxx
     * _  xxx=>
     * xxx
     * }
     *
     * 模式匹配中，如果没有对应的匹配，那么就报错!!!
     */

    /**
     * 可以匹配变量值
     */
//    var i: Int = 100
//    i match {
//      case 20 => println("该值是20")
//      case 50 => println("该值是50")
//      //      case 100=>println("该值是100")
//      case _ => println("其他值")
//    }
//
//    /**
//     * 匹配数据类型
//     */
//    var flag1: Any = true
//    flag1 match {
//      case _: Int => println("是Int类型")
//      case _: Boolean => println("是boolean类型")
//    }
//
//    /**
//     * 匹配元组
//     */
//    val t1: (Int, String, Int) = Tuple3(1001, "张三", 18)
//    t1 match {
//      case (a1: Int, b1: String, c1: Int) =>
//        println(s"学号:$a1, 姓名:$b1, 年龄:$c1")
//    }
//
//    /**
//     * 匹配数组
//     */
//    val array: Array[Any] = Array(1001, "李四", "男", 18, "理科一班")
//    array match {
//      case Array(id: Int, name: String, gender: String, age: Int, clazz: String) =>
//        println(s"学号:$id, 姓名:$name, 性别:$gender, 年龄:$age, 班级:$clazz")
//    }
//
//    /**
//     * 模式匹配的应用1：避免异常
//     *
//     */
//    val map1: Map[Int, String] = Map((1001, "张三"), (1002, "李四"))
//    //    val res1: Option[String] = map1.get(1001) // Some("张三")
//    //    println(res1.get)
//    //    val res1: Option[String] = map1.get(1003)
//    //    println(res1.get)
//
//    val sc: Scanner = new Scanner(System.in)
//    println("请输入要查询的键：")
//    val key: Int = sc.nextInt()
//    map1.get(key) match {
//      case Some(a: Any) => println(s"${key}键对应的值为$a")
//      case None => println(s"${key}键不存在！")
//    }

    println("=" * 50)
    /**
     * 模式匹配的应用2：简化代码
     *
     */
    val stuList: List[String] = Source.fromFile("scala/data/students.txt").getLines().toList
    val stuArrayList: List[Array[String]] = stuList.map((line: String) => line.split(","))
    stuArrayList.map((e:Array[String])=>{
      val id: String = e(0)
      val name: String = e(1)
      val age: String = e(2)
      val gender: String = e(3)
      val clazz: String = e(4)
      (id, name, gender, age, clazz)
    }).foreach(println)


    stuArrayList.map{
      case Array(id: String, name: String, gender: String, age: String, clazz: String)=>
        (id, name, gender, age, clazz)
    }.foreach(println)


  }
}
